package hmvc4gwt.framework.client.controller;

import hmvc4gwt.client.controller.AController;
import hmvc4gwt.client.event.IEvent;
import hmvc4gwt.framework.client.events.TerminateEvent;

import com.google.gwt.user.client.History;
import com.google.gwt.user.client.HistoryListener;

/**
 * Der NavigationController dient als HistoryListener innerhalb der
 * HMVC-Strucktur.
 * 
 * NavigationController können in unterschieldichen Hirachistufen zur Verfügung
 * stehen. Jeder NavigationController reagiert nur auf seine histroyToken. Der
 * NavigationController registriert sich bei der Initialisierung bei der History
 * und entfernt sich beim Eintreffen eines DisposeEvents wieder aus ihr.
 * 
 * Es muss nur noch die onHistoryChanged(historyToken) implementiert werden.
 * 
 * @author jens.meiss
 * 
 */
public abstract class NavigationController extends AController implements
		HistoryListener {

	/**
	 * registriert den Controller als HistoryListener
	 */
	public final void init() {

		History.addHistoryListener(this);

		register(TerminateEvent.class, this);

		initImpl();
	}

	public abstract void initImpl();

	/**
	 * reagiert auf die Events DisposeEvent und CloseEvent
	 */
	public final void handleEvent(IEvent event) {

		if (event instanceof TerminateEvent) {

			/*
			 * HistoryListener entfernen
			 */
			History.removeHistoryListener(this);

			/*
			 * Triade entfernen
			 */
			getComponent().terminate();
		} else {
			
			handleEventImpl(event);
			
		}
	}

	public abstract void handleEventImpl(IEvent event);
}
